//! 通用工具函数

/// 将不同进制的数字转换为十进制字符串
pub fn convert_to_decimal(s: &str) -> String {
    if s.starts_with("0x") || s.starts_with("0X") {
        // 十六进制 - 先尝试i32，失败则尝试u32，再失败则尝试i64
        if let Ok(value) = i32::from_str_radix(&s[2..], 16) {
            value.to_string()
        } else if let Ok(value) = u32::from_str_radix(&s[2..], 16) {
            // 对于0x80000000这样的情况，作为无符号数处理
            (value as i64).to_string()
        } else if let Ok(value) = i64::from_str_radix(&s[2..], 16) {
            value.to_string()
        } else {
            s.to_string() // 最终失败时保持原样
        }
    } else if s.starts_with('0') && s.len() > 1 && s.chars().all(|c| c.is_ascii_digit() && c <= '7') {
        // 八进制 - 先尝试i32，失败则尝试u32，再失败则尝试i64
        if let Ok(value) = i32::from_str_radix(s, 8) {
            value.to_string()
        } else if let Ok(value) = u32::from_str_radix(s, 8) {
            (value as i64).to_string()
        } else if let Ok(value) = i64::from_str_radix(s, 8) {
            value.to_string()
        } else {
            s.to_string() // 最终失败时保持原样
        }
    } else {
        // 十进制 - 先尝试i32，失败则尝试i64
        if let Ok(value) = s.parse::<i32>() {
            value.to_string()
        } else if let Ok(value) = s.parse::<i64>() {
            value.to_string()
        } else {
            s.to_string() // 最终失败时保持原样
        }
    }
}
